Boto3で特定のAPIが使えない時に確認したい、AWS サービスのカスタムモデルデータ
Boto3を使っていて、使ってるBoto3やbotocoreのバージョンは古くないはずなのに特定のAPIが呼べないということがありました。~/.aws/models
を確認したところ、特定のAPIが使えなかったサービスのモデルファイル(JSON)が入っており、そのファイルを削除することで、特定のAPIが使えないという問題が解決しました。どうやら以前、そのサービスのモデルファイルを追加し、削除し忘れていたようです。折角なので、今回はモデルファイルの追加と削除を試してみました。
概要
botocoreのbotocore/dataにはJSON形式でモデルデータが定義されています。AWS CLIやBoto3はこのモデルデータを参照し、どういうAWSサービスが存在して、それぞれにどういう操作が可能で、操作に使用するデータはどういう形式かという情報を得ます。
botocoreではモデルデータを読み込むデフォルトのパスとして、botocore/data
の他に~/.aws/models
が定義されています。~/.aws/models
はカスタム用のモデルデータの配置場所です。AWS CLIのadd-modelによって追加されたモデルデータは~/.aws/models
に保存されます。
やってみる
モデルデータの作成
今回はEC2のモデルを元に検証用のモデルデータを作成します。
{ "version": "2.0", "metadata": { "apiVersion": "2016-11-15", "endpointPrefix": "ec2", "protocol": "ec2", "serviceAbbreviation": "Amazon EC2", "serviceFullName": "Amazon Elastic Compute Cloud", "serviceId": "EC2", "signatureVersion": "v4", "uid": "ec2-2016-11-15", "xmlNamespace": "http://ec2.amazonaws.com/doc/2016-11-15" }, "operations": { "CreateHogehoge": { "name": "CreateHogehoge", "http": { "method": "POST", "requestUri": "/" }, "input": { "shape": "CreateHogehogeRequest" }, "output": { "shape": "CreateHogehogeResult" }, "documentation": "<p>Creates a hogehoge</p>" } }, "shapes": { "CreateHogehogeRequest": { "type": "structure", "members": { } }, "CreateHogehogeResult": { "type": "structure", "members": { } } }, "documentation": "<fullname>Amazon Elastic Compute Cloud</fullname>" }
モデルの追加
AWS CLIでモデルを追加します。--service-model
ではモデルファイルを指定するんですが、file://
からはじまるフルパスで指定する必要があります。--service-name
は必須の引数ではないんですが、指定して名前をつけることで既存のモデルへの上書きを避けることができます。ここでもしサービス名を指定せず、EC2としてモデルが登録されると、カスタムモデルの方が優先して読み込まれるため、既存のEC2のモデルが上書きされることになります。その場合は追加したモデルデータを削除することで、元に戻ります。
aws configure add-model --service-model file://`pwd`/ec2.json --service-name ec2-2
モデルを追加した後は、AWS CLIやBoto3で指定できるようになります。今回定義した操作create-hogehoge
はAWS側のAPIが対応していないので、エラーが発生します。
aws ec2-2 create-hogehoge
Boto3でも同様に試してみると、クライアントを作成することはできますが、AWS側のAPIが対応していないので、create_hogehoge()
を実行するとエラーが発生しました。
import boto3 ec2_2 = boto3.client('ec2-2') ec2_2.create_hogehoge()
~/.aws/models
を確認してみると、先ほど追加したモデルが配置されています。
ls -R ~/.aws/models
モデルの削除
モデルの削除についてはコマンドが見つかりませんでした。少々強引ですが、~/.aws/models/
配下の対象とするモデルデータを削除することで、モデルを削除することができます。
rm -r ~/.aws/models/ec2-2
モデルを削除したので、ec2-2 create-hogehoge
は使えなくなりました。
aws ec2-2 create-hogehoge
さいごに
モデルの追加は自らの手でしか行えないものだとは思いますが、忘れてしまうこともあるかと思います。AWS CLIやBoto3の挙動がおかしいなと思った際はモデルが上書きされていないかを確認してみると良いかもしれません。